/**
 * 入口组件，类比于 小程序 App.js
 *
 *    1. 全局样式，也需要在当前文件，引入进来
 *    2. 组件返回的内容，写死为 children
 *    3. 应用级别的生命周期钩子 @tarojs/taro 包中导入相关的 hooks
 *      onLaunch => useLaunch
 *      onShow   => useDidShow
 *      onHide   => useDidHide
 *      onError  => useError
 *      onPageNotFound  => usePageNotFound
 *      onUnhandledRejection  => useUnhandledRejection
 *      onThemeChange => onThemeChange
 */
import {
  useLaunch,
  useError,
  useUnhandledRejection,
  usePageNotFound,
  reLaunch,
} from "@tarojs/taro";
import "./app.scss";

function App({ children }) {
  useLaunch(() => {
    console.log("App launched.");
  });

  // 小程序发生脚本错误或 API 调用报错时触发的回调。
  //    可以处理，线上环境的异常收集
  useError((error: string) => {
    console.log("useError", error);
  });

  // 小程序有未处理的 Promise reject 时触发
  //    可以处理，线上环境的异常收集
  useUnhandledRejection((error) => {
    console.log("useUnhandledRejection", error.reason, error.promise);
  });

  // 小程序要打开的页面不存在时触发的回调
  //     1. 直接跳转到一个不存在的页面，是不会触发该回调的
  //     2. 通过编译模式直接启动一个不存在的页面时，才会触发。有点问题
  //        1. 之前有个页面 pages/act/index 活动页面上线了，且提供了小程序码
  //        2. 后面活动下架了，将 pages/act/index 页面也给删除了。这时用户通过之前的小程序码扫描就会进入一个报错页面。
  //        3. 这种情况，可以使用 usePageNotFound 来监控得到，且在逻辑代码中做 reLaunch
  usePageNotFound((res) => {
    console.log("usePageNotFound", res);
    reLaunch({
      url: "/pages/home/index",
    });
  });

  // children 是将要会渲染的页面
  return children;
}

export default App;
